package com.dc.juc.example._4_publish;


import com.dc.juc.annoations.NotThreadSafe;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.concurrent.TimeUnit;

/**
 * Description: 不安全的对象发布
 *
 *   demo中使用get方法把私有属性value数组返回出去，这就是对象的发布，
 *   在外面的代码也就是main方法拿到value数组时，同时又启动了一个线程，也就是两个线程同时对value数组进行操作，
 *   新线程对value数组进行了修改，而主线程在读取value数组，这时的结果是不确定的，
 *   有可能新线程没有修改完成主线程就读到了abc，有可能主线程读到的是修改后的dbc，所以这种对象的发布是不安全的
 *
 * @author: gdc
 * @date: 2021/8/4
 * @version 1.0
 */
@Slf4j
@NotThreadSafe
public class UnsafePublish {

    private String[] values = {"a", "b", "c"};

    /**
     * 获取对象内容
     */
    public String[] getValues() {
        return values;
    }

    public static void main(String[] args) throws InterruptedException {
        UnsafePublish unsafePublish = new UnsafePublish();

        // 启动一个线程对values值进行修改
        new Thread(() -> {
            String[] values = unsafePublish.getValues();
            values[0] = "1";
        }, "线程A").start();

        //主线程等待一会，这里只是为了显现出来错误：其他线程有可能修改
        //有可能比主线程快，有可能慢，所以打印的结果是随机的
        TimeUnit.SECONDS.sleep(5);

        log.info("{}", Arrays.toString(unsafePublish.getValues()));
    }
}
